package com.xbongbong.paas.outerlink.interfaces;

import com.xbongbong.outLink.domain.entity.OuterLinkEntity;
import com.xbongbong.paas.domain.entity.PaasFormDataEntity;
import com.xbongbong.paas.domain.entity.ext.PaasFormDataEntityExt;
import com.xbongbong.paas.domain.entity.ext.PaasFormEntityExt;
import com.xbongbong.paas.field.FieldAttrEntity;
import com.xbongbong.paas.pojo.dto.FormDataAddDTO;
import com.xbongbong.paas.pojo.dto.FormDataListDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkAddDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkAddGetDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkBaseDTO;
import com.xbongbong.paas.pojo.dto.OuterLinkListDTO;
import com.xbongbong.paas.pojo.dto.ValidateDataDTO;
import com.xbongbong.paas.pojo.vo.AfterSaveVO;
import com.xbongbong.paas.pojo.vo.FormDataAddGetVO;
import com.xbongbong.paas.pojo.vo.FormDataAddVO;
import com.xbongbong.paas.pojo.vo.FormDataUpdateGetVO;
import com.xbongbong.paas.pojo.vo.PaasFormDataEsListVO;
import com.xbongbong.paas.pojo.vo.ParseSingleRowDataVO;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.pro.formexplain.pojo.HandleExplainPojo;
import com.xbongbong.pro.workorder.pojo.vo.WorkOrderDataEsListVO;

import java.util.List;
import java.util.Map;

/**
 * @author long.rao
 * @version v1.0
 * @date 2020/8/10 10:52
 * @since v1.0
 */
public interface PaasOuterLinkService {


    /**
     * 业务类型
     * 用于做外链bean登记
     * @return 业务类型列表
     */
    List<Integer> businessType();

    /**
     * 获取数据列表
     * @param outerLinkDTO 入参
     * @return 数据列表回参
     * @throws XbbException 系统异常
     */
    PaasFormDataEsListVO getList(OuterLinkListDTO outerLinkDTO) throws XbbException;

    /**
     * 获取外链查询列表
     * @param formDataListDTO 入参
     * @param token token
     * @return  PaasFormDataEsListVO
     */
    PaasFormDataEsListVO  getOuterLinkList(FormDataListDTO formDataListDTO,String token) throws XbbException;

    /**
     * 处理外链列表字段解释
     * <p> 原位置 com.xbongbong.paas.help.FormDataListSearchHelp#handlOuterLinkExplains(com.xbongbong.paas.pojo.dto.FormDataListDTO, com.xbongbong.paas.domain.entity.ext.PaasFormEntityExt) </p>
     * @param formDataListDTO 列表入参
     * @param form 表单实体
     * @return  HandleExplainPojo
     * @throws XbbException 系统异常
     */
    HandleExplainPojo handlOuterLinkExplains(FormDataListDTO formDataListDTO, PaasFormEntityExt form) throws XbbException;

    /**
     * 列表筛选条件特殊逻辑
     * @param formDataListDTO 列表入参
     * @throws XbbException 系统异常
     */
    void formatListCondition(FormDataListDTO formDataListDTO) throws XbbException;

    /**
     * 特殊处理外链列表数据
     * @param formDataListDTO 入参
     * @param paasFormDataEsListVO 回参
     * @param workOrderDataEsListVO 工单回参
     * @throws XbbException 系统异常
     */
    void handleDataList(FormDataListDTO formDataListDTO, PaasFormDataEsListVO paasFormDataEsListVO, WorkOrderDataEsListVO workOrderDataEsListVO) throws XbbException;


    /**
     * 获取单个数据详情
     * @param outerLinkBaseDTO 入参
     * @return 数据详情回参
     * @throws XbbException 系统异常
     */
    FormDataUpdateGetVO get(OuterLinkBaseDTO outerLinkBaseDTO) throws XbbException;

    /**
     * 处理外链get解释
     * @param explainList 字段解释列表
     * @param outerLinkBaseDTO 入参
     * @param formData 表单数据实体
     * @param paasFormEntityExt 表单设置实体
     * @throws XbbException 系统异常
     */
    void handleGetExplains(List<FieldAttrEntity> explainList,OuterLinkBaseDTO outerLinkBaseDTO,PaasFormDataEntityExt formData,PaasFormEntityExt paasFormEntityExt) throws XbbException;

    /**
     * 处理get的data数据
     * @param outerLinkBaseDTO 入参
     * @param formData 表单数据
     * @param parseSingleRowDataVO 解析数据vo
     * @param explains 字段解释
     * @throws XbbException 系统异常
     */
    void handleGetData(OuterLinkBaseDTO outerLinkBaseDTO, PaasFormDataEntityExt formData, ParseSingleRowDataVO parseSingleRowDataVO, List<FieldAttrEntity> explains) throws XbbException;

    /**
     * get方法格式化数据data
     * @param outerLinkBaseDTO 入参
     * @param explainMap 解释映射
     * @param formData 表单数据
     * @param formDataUpdateGetVO 回参
     * @throws XbbException 系统异常
     */
    void formatData(OuterLinkBaseDTO outerLinkBaseDTO, Map<String, FieldAttrEntity> explainMap, PaasFormDataEntityExt formData,FormDataUpdateGetVO formDataUpdateGetVO) throws XbbException;

    /**
     * get方法特殊处理回参vo
     * @param formDataUpdateGetVO 回参
     * @param outerLinkBaseDTO 入参
     * @throws XbbException  系统异常
     */
    void handleGetReturnVo(FormDataUpdateGetVO formDataUpdateGetVO,OuterLinkBaseDTO outerLinkBaseDTO) throws XbbException;

    /**
     * 保存数据
     * @param outerLinkAddDTO  入参
     * @return 数据回参
     * @throws XbbException 系统异常
     */
    FormDataAddVO add(OuterLinkAddDTO outerLinkAddDTO) throws XbbException;

    /**
     * 工单保存数据（特殊）
     * @param outerLinkAddDTO 入参
     * @return  FormDataAddVO
     * @throws XbbException 系统异常
     */
    default FormDataAddVO addForWorkOrder(OuterLinkAddDTO outerLinkAddDTO,FormDataAddVO formDataAddVO) throws XbbException {
        return formDataAddVO;
    }


    void beforeSave(ValidateDataDTO validateDataDTO) throws XbbException;


    AfterSaveVO insert(FormDataAddDTO formDataAddDTO, PaasFormDataEntity paasFormDataEntity, PaasFormEntityExt paasFormEntityExt) throws XbbException;;

    /**
     * 在新建时，返回初始化字段属性和数据（流水号等）
     * @param outerLinkAddGetDTO 入参
     * @return FormDataAddGetVO
     * @throws XbbException  系统异常
     */
    FormDataAddGetVO addGet(OuterLinkAddGetDTO outerLinkAddGetDTO) throws XbbException;


    /**
     * 在新建时，返回初始化字段属性和数据（工单特殊）
     * @param outerLinkAddGetDTO 入参
     * @return  FormDataAddGetVO
     * @throws XbbException 系统异常
     */
    default FormDataAddGetVO addGetForWorkOrder(OuterLinkAddGetDTO outerLinkAddGetDTO,FormDataAddGetVO vo) throws XbbException {
        return vo;
    }


    /**
     * 校验并解析token 解析出businessType corpid formId
     * @param token token
     * @param type 类型
     * @return 外链实体
     * @throws XbbException 系统异常
     */
    OuterLinkEntity getTokenByType(String token, Integer type) throws XbbException;


}
